﻿using System;
using System.Collections.Generic;

/// <summary>
/// 列数据的格式设置
/// </summary>
public class ExportSetting
{
    /// <summary>
    /// 列名 对应数据库查询结果的列名
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 标题 对应页面展示列表头文本
    /// </summary>
    public string Title { get; set; }

    /// <summary>
    /// 显示宽度
    /// </summary>
    public int? Width { get; set; }

    /// <summary>
    /// 水平对齐类型
    /// </summary>
    public string Align { get; set; }

    /// <summary>
    /// 控件类型：select
    /// </summary>
    public string Type { get; set; }
    
    public dynamic Items { get; set; }

    public dynamic ItemAttr { get; set; }

    /// <summary>
    /// 格式化数据 ，可传递参数 进行格式化（数据结果中必须 存在 该 Name）
    /// </summary>
    public Func<object, object> Format { get; set; }


    private Func<object, object, object> _FormatByParam { get; set; }
    /// <summary>
    /// 格式化数据 ，可传递参数 进行格式化（数据结果中必须 存在 该 Name）
    /// </summary>
    public Func<object, object, object> FormatByParam
    {
        get
        {
            if (_FormatByParam != null)
            {
                return _FormatByParam;
            }
            else
            {
                if (!string.IsNullOrWhiteSpace(Pattern))
                {
                    switch (Pattern)
                    {
                        case "yyyy-MM-dd":
                        case "yyyy-MM-dd HH:mm":
                        case "yyyy-MM-dd HH:mm:ss":
                        case "yyyy-MM-dd HH:mm:ss.fff":
                            return FormatUtils.FormatDateTime;
                        default:
                            return null;
                    }
                }
                return null;
            }
        }
        set
        {
            _FormatByParam = value;
        }
    }

    /// <summary>
    ///1. 参与格式化数据，可能需要的参数
    ///2. 方法签名必须与 FormatByParam 签名一致
    /// </summary>
    public string Pattern { get; set; }

    /// <summary>
    ///1. Dictionary 为行数据信息
    ///2. 格式化数据 ，可传递 行数据 进行格式化（页面列表自定义列的情况，数据结果中 可以不存在 该Name）
    ///3. 方法签名必须与 FormatByRow 签名一致
    /// </summary>
    public Func<Dictionary<string, object>, object> FormatByRow { get; set; }


    private class FormatUtils
    {
        public static object FormatDateTime(object strDateTime, object format)
        {
            if (strDateTime == null || string.IsNullOrWhiteSpace(strDateTime.ToString())) return string.Empty;
            DateTime dtTmp;
            if (DateTime.TryParse(strDateTime.ToString(), out dtTmp))
            {
                return dtTmp.ToString(format.ToString());
            }
            return strDateTime;
        }
    }
}